/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package LogicaNegocio.Controlador;

import AccesoDatos.Persistencia.Manager.ManagerEjemplar;
import AccesoDatos.Persistencia.Manager.ManagerInformes;
import AccesoDatos.Persistencia.Manager.ManagerOrden;
import AccesoDatos.Persistencia.Manager.ManagerPrestamo;
import GUI.Bibliotecario.AdminPrestamos.PanelRegistrarPrestamo;
import LogicaNegocio.Biblioteca.Ejemplar;
import LogicaNegocio.Biblioteca.Orden;
import LogicaNegocio.Biblioteca.Prestamo;
import LogicaNegocio.Usuarios.Usuario;
import MainBiblioSoft.BiblioSoft;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 * Esta clase en java permite el control de eventos generados
 * desde el panel prestamos.
 *
 * @author sebaxtian
 * Archivo: ControlPrestamo.java
 * @version 1.0
 * Fecha: mié jun  2 16:54:08 COT 2010
 */


public class ControlPrestamo {

    //Atributos de clase
    private PanelRegistrarPrestamo panelRegistrarPrestamo;
    private ManagerOrden gestorOrden;
    private ManagerPrestamo gestorPrestamo;
    private ManagerEjemplar gestorEjemplar;
    private ManagerInformes gestorInformes;
    private List<Orden> listaOrdenes;
    private Orden ordenSeleccionada;

    public ControlPrestamo(PanelRegistrarPrestamo panelRegistrarPrestamo) {
        this.panelRegistrarPrestamo = panelRegistrarPrestamo;
        gestorEjemplar = new ManagerEjemplar();
        gestorOrden = new ManagerOrden();
        gestorPrestamo = new ManagerPrestamo();
        gestorInformes = new ManagerInformes();
        listaOrdenes = new ArrayList<Orden>();
    }

    public void actualizarOrdenes() {
        limpiarTablaOrdenes();
        listaOrdenes = gestorInformes.obtenerOrdenesDelDia();
        mostrarOrdenes(listaOrdenes);
    }

    public void verOrden() {
        Orden orden = obtenerOrdenSeleccionada();
        if(orden != null){
            Usuario usuario = orden.getUsuario();
            Ejemplar ejemplar = orden.getEjemplar();
            mostrarUsuario(usuario);
            limpiarTablaEjemplares();
            mostrarEjemplaresDeUsuario(usuario);
            mostrarEjemplar(ejemplar);
            ordenSeleccionada = orden;
        }
    }

    public void cancelarOrden() {
        Orden orden = obtenerOrdenSeleccionada();
        if(orden != null){
            gestorOrden.cancelarOrden(orden.getIdOrden());
            limpiar();
            listaOrdenes = gestorInformes.obtenerOrdenesDelDia();
            mostrarOrdenes(listaOrdenes);
        }
    }

    public void aceptarPrestamo() {
        panelRegistrarPrestamo.panelParaCalendario.add(panelRegistrarPrestamo.calendario);
        panelRegistrarPrestamo.frameFechaEntrega.setLocationRelativeTo(null);
        panelRegistrarPrestamo.frameFechaEntrega.pack();
        panelRegistrarPrestamo.frameFechaEntrega.setResizable(false);
        panelRegistrarPrestamo.frameFechaEntrega.setVisible(true);
    }

    public void realizarPrestamo() {
        Date fechaEntrega = panelRegistrarPrestamo.calendario.getDate();
        Date fechaActual = Calendar.getInstance().getTime();
        if(fechaEntrega.after(fechaActual) || fechaEntrega.equals(fechaActual)){
            if(ordenSeleccionada != null){
                Prestamo prestamo = new Prestamo();
                Ejemplar ejemplar = ordenSeleccionada.getEjemplar();
                ejemplar.setDisponible(false);
                prestamo.setBibliotecario(BiblioSoft.bibliotecario);
                prestamo.setCedulaBibliotecario(BiblioSoft.bibliotecario.getCedula());
                prestamo.setDevuelto(false);
                prestamo.setFechaEntrega(fechaEntrega);
                prestamo.setIdOrden(ordenSeleccionada.getIdOrden());
                prestamo.setOrden(ordenSeleccionada);
                gestorPrestamo.crearPrestamo(prestamo);
                gestorEjemplar.actualizarEjemplar(ejemplar.getIdEjemplar(), ejemplar);
                gestorOrden.cancelarOrden(ordenSeleccionada.getIdOrden());
                JOptionPane.showMessageDialog(panelRegistrarPrestamo, "El prestamo fue registrado con exito", "Prestamo", JOptionPane.PLAIN_MESSAGE);
                cancelarOrdenesEjemplar(ejemplar);
                limpiar();
            }else{
                JOptionPane.showMessageDialog(panelRegistrarPrestamo, "Debe seleccionar una orden de prestamo", "Prestamo", JOptionPane.INFORMATION_MESSAGE);
            }
        }else{
            JOptionPane.showMessageDialog(panelRegistrarPrestamo, "La fecha de entrega debe ser posterior o igual a la fecha actual", "Prestamo", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    private void cancelarOrdenesEjemplar(Ejemplar ejemplarPrestado) {
        for(int i = 0; i < listaOrdenes.size(); i++){
            if(listaOrdenes.get(i).getIdEjemplar() == ejemplarPrestado.getIdEjemplar()){
                gestorOrden.cancelarOrden(listaOrdenes.get(i).getIdOrden());
            }
        }
    }

    private Orden obtenerOrdenSeleccionada() {
        int idOrden = -1;
        Orden orden = null;
        int fila = panelRegistrarPrestamo.tablaOrdenes.getSelectedRow();
        if(fila != -1){
            idOrden = new Integer(panelRegistrarPrestamo.tablaOrdenes.getValueAt(fila, 0).toString());
        }
        for(int i = 0; i < listaOrdenes.size(); i++){
            if(idOrden == listaOrdenes.get(i).getIdOrden()){
                orden = listaOrdenes.get(i);
                break;
            }
        }
        return orden;
    }

    private void mostrarUsuario(Usuario usuario) {
        panelRegistrarPrestamo.textFieldCedula.setText(usuario.getIdentificacionUsuario()+"");
        panelRegistrarPrestamo.textFieldPrimerApellido.setText(usuario.getPrimerApellido());
        panelRegistrarPrestamo.textFieldPrimerNombre.setText(usuario.getPrimerNombre());
        panelRegistrarPrestamo.textFieldSegundoApellido.setText(usuario.getSegundoApellido());
        panelRegistrarPrestamo.textFieldSegundoNombre.setText(usuario.getSegundoNombre());
        panelRegistrarPrestamo.textFieldValorMulta.setText(gestorInformes.obtenerValorMulta(usuario.getIdentificacionUsuario())+"");
        
    }

    private void mostrarEjemplaresDeUsuario(Usuario usuario) {
        List<Ejemplar> listaEjemplares = new ArrayList<Ejemplar>();
        listaEjemplares = gestorInformes.obtenerEjemplaresPrestadosA(usuario.getIdentificacionUsuario());
        Ejemplar ejemplar;
        for(int i = 0; i < listaEjemplares.size(); i++){
            if(panelRegistrarPrestamo.tablaEjemplares.getRowCount() <= i){
                DefaultTableModel tmp = (DefaultTableModel)panelRegistrarPrestamo.tablaEjemplares.getModel();
                Object fila[] = {"","","","",""};
                tmp.addRow(fila);
            }
            ejemplar =  listaEjemplares.get(i);
            panelRegistrarPrestamo.tablaEjemplares.setValueAt(ejemplar.getNumeroSala(), i, 0);
            panelRegistrarPrestamo.tablaEjemplares.setValueAt(ejemplar.getNumeroPasillo(), i, 1);
            panelRegistrarPrestamo.tablaEjemplares.setValueAt(ejemplar.getNumeroEstante(), i, 2);
            panelRegistrarPrestamo.tablaEjemplares.setValueAt(ejemplar.getNumeroCajon(), i, 3);
            panelRegistrarPrestamo.tablaEjemplares.setValueAt(gestorInformes.ejemplarVencido(ejemplar.getIdEjemplar()), i, 4);
        }
    }

    private void mostrarEjemplar(Ejemplar ejemplar) {
        panelRegistrarPrestamo.textFieldISBN.setText(ejemplar.getIsbn().toString());
        panelRegistrarPrestamo.textFieldNumCajon.setText(ejemplar.getNumeroCajon()+"");
        panelRegistrarPrestamo.textFieldNumEstante.setText(ejemplar.getNumeroEstante()+"");
        panelRegistrarPrestamo.textFieldNumPasillo.setText(ejemplar.getNumeroPasillo()+"");
        panelRegistrarPrestamo.textFieldNumSala.setText(ejemplar.getNumeroSala()+"");
        panelRegistrarPrestamo.checkBoxDisponible.setSelected(ejemplar.isDisponible());
    }

    private void mostrarOrdenes(List<Orden> listaOrdenes) {
        Orden orden;
        for(int i = 0; i < listaOrdenes.size(); i++){
            if(panelRegistrarPrestamo.tablaOrdenes.getRowCount() <= i){
                DefaultTableModel tmp = (DefaultTableModel)panelRegistrarPrestamo.tablaOrdenes.getModel();
                Object fila[] = {"","",""};
                tmp.addRow(fila);
            }
            orden = listaOrdenes.get(i);
            panelRegistrarPrestamo.tablaOrdenes.setValueAt(orden.getIdOrden(), i, 0);
            panelRegistrarPrestamo.tablaOrdenes.setValueAt(orden.getIdentificacionUsuario(), i, 1);
            panelRegistrarPrestamo.tablaOrdenes.setValueAt(orden.getHora(), i, 2);
        }
    }

    private void limpiarTablaOrdenes() {
        DefaultTableModel tmp = (DefaultTableModel)panelRegistrarPrestamo.tablaOrdenes.getModel();
        for(int i = 0; i < panelRegistrarPrestamo.tablaOrdenes.getRowCount(); i++){
            tmp.removeRow(i);
            if(tmp.getRowCount()>0){
                limpiarTablaOrdenes();
            }
        }
        listaOrdenes.clear();
    }

    private void limpiarTablaEjemplares() {
        DefaultTableModel tmp = (DefaultTableModel)panelRegistrarPrestamo.tablaEjemplares.getModel();
        for(int i = 0; i < panelRegistrarPrestamo.tablaEjemplares.getRowCount(); i++){
            tmp.removeRow(i);
            if(tmp.getRowCount()>0){
                limpiarTablaEjemplares();
            }
        }
    }

    private void limpiar() {
        limpiarTablaOrdenes();
        limpiarTablaEjemplares();
        ordenSeleccionada = null;
        panelRegistrarPrestamo.textFieldCedula.setText("");
        panelRegistrarPrestamo.textFieldISBN.setText("");
        panelRegistrarPrestamo.textFieldNumCajon.setText("");
        panelRegistrarPrestamo.textFieldNumEstante.setText("");
        panelRegistrarPrestamo.textFieldNumPasillo.setText("");
        panelRegistrarPrestamo.textFieldNumSala.setText("");
        panelRegistrarPrestamo.textFieldPrimerApellido.setText("");
        panelRegistrarPrestamo.textFieldPrimerNombre.setText("");
        panelRegistrarPrestamo.textFieldSegundoApellido.setText("");
        panelRegistrarPrestamo.textFieldSegundoNombre.setText("");
        panelRegistrarPrestamo.textFieldValorMulta.setText("");
    }
}
